package com.xhui.vimarket.zkplus.utils;

import java.util.Map;

import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Messagebox;

import com.xhui.vimarket.zkplus.zul.MessageboxPlus;

public class ZkMsgBox {
    
    private static ZkMsgBox msgBox;
    
    private ZkMsgBox(final String key) {
        MessageboxPlus.setTemplate("/public/zul/message_box.zul");
    }
    
    private ZkMsgBox(final Class clazz) {
        MessageboxPlus.setTemplate("/public/zul/message_box.zul");
    }
    
    public static ZkMsgBox getMsgBox(final String key) {
        return new ZkMsgBox(key);
    }
    
    public static ZkMsgBox getMsgBox(final Class clazz) {
        return new ZkMsgBox(clazz);
    }
    
    public static ZkMsgBox instance(final String key) {
        if (ZkMsgBox.msgBox == null) {
            ZkMsgBox.msgBox = ZkMsgBox.getMsgBox(key);
        }
        return ZkMsgBox.msgBox;
    }
    
    /**
     * 弹出消息提示框
     * 
     * @param message
     *            提示消息
     * @param title
     *            提示框标题
     * @param moreMessage 更多信息
     * @param idsMap 预留，控件消息map
     * 
     */
    public void showInfo(final String message, final String title, final String moreMessage,
        final Map idsMap) {
        try {
            MessageboxPlus.show(message, title, Messagebox.OK, Messagebox.INFORMATION, moreMessage,
                idsMap, null);
        } catch (final InterruptedException e) {
            // ignore
        }
    }
    
    /**
     * 弹出消息提示框
     * 
     * @param message
     *            提示消息
     * @param title
     *            提示框标题
     * @param moreMessage 更多信息
     */
    public void showInfo(final String message, final String title, final String moreMessage) {
        try {
            MessageboxPlus.show(message, title, Messagebox.OK, Messagebox.INFORMATION, moreMessage,
                null, null);
        } catch (final InterruptedException e) {
            // ignore
        }
    }
    
    /**
     * 弹出警告提示框
     * 
     * @param message
     *            提示消息
     * @param title
     *            提示框标题
     * @param moreMessage 更多信息
     * @param idsMap 预留，控件消息map
     */
    public void showWarn(final String message, final String title, final String moreMessage,
        final Map idsMap) {
        try {
            MessageboxPlus.show(message, title, Messagebox.OK, Messagebox.EXCLAMATION, moreMessage,
                idsMap, null);
        } catch (final InterruptedException e) {
            // ignore
        }
    }
    
    /**
     * 弹出警告提示框
     * 
     * @param message
     *            提示消息
     * @param title
     *            提示框标题
     * @param moreMessage 更多信息
     */
    public void showWarn(final String message, final String title, final String moreMessage) {
        try {
            MessageboxPlus.show(message, title, Messagebox.OK, Messagebox.EXCLAMATION, moreMessage,
                null, null);
        } catch (final InterruptedException e) {
            // ignore
        }
    }
    
    /**
     * 弹出消息提示框
     * 
     * @param message
     *            提示消息
     * @param title
     *            提示框标题
     * @param moreMessage 更多信息
     * @param idsMap 预留，控件消息map
     */
    public void showError(final String message, final String title, final String moreMessage,
        final Map idsMap) {
        try {
            MessageboxPlus.show(message, title, Messagebox.OK, Messagebox.ERROR, moreMessage,
                idsMap, null);
        } catch (final InterruptedException e) {
            // ignore
        }
    }
    
    /**
     * 弹出消息提示框
     * 
     * @param message
     *            提示消息
     * @param title
     *            提示框标题
     * @param moreMessage 更多信息
     */
    public void showError(final String message, final String title, final String moreMessage) {
        try {
            MessageboxPlus.show(message, title, Messagebox.OK, Messagebox.ERROR, moreMessage, null,
                null);
        } catch (final InterruptedException e) {
            // ignore
        }
    }
    
    /**
     * 询问提示框
     * <p>
     * 如果禁用事件处理线程，该方法会立即返回，返回值永远为true。 如果作为if判断语句的条件，
     * 那么else部分永远不会执行，启用和开启事件处理请查看zk.xml配置: <br />
     * &lt;system-config&gt;<br />
     * &lt;disable-event-thread&gt;false&lt;/disable-event-thread&gt;<br />
     * &lt;/system-config&gt;
     * 
     * @param message
     *            提示消息 提示框标题
     * @param title 标题
     * @return 禁用事件处理线程该方法永远返回true，启用事件处理相称时，如果用户点击ok按钮，返回true,反之false
     */
    public boolean showQuestion(final String message, final String title) {
        return Messagebox.OK == Messagebox.show(message, title, Messagebox.OK
		    | Messagebox.CANCEL, Messagebox.QUESTION);
    }
    
    /**
     * 询问提示框
     * <p>
     * 该方法是一个类似 {@link #showQuestion(String, String)}
     * 的方法，但与其不同的是，当禁用事件处理线程时，该方法非常有用。
     * <p>
     * <p>
     * 示例:<br />
     * <hr>
     * 
     * <pre>
     * ZkUtils.showQuestion(&quot;您确定删除该记录吗？&quot;, &quot;询问&quot;, new EventListener() {
     *     &#064;Override
     *     public void onEvent(Event event) throws Exception {
     *         int clickedButton = (Integer) event.getData();
     *         if (clickedButton == Messagebox.OK) {
     *             // 用户点击的是确定按钮
     *         } else {
     *             // 用户点击的是取消按钮
     *         }
     *     }
     *     
     * });
     * </pre>
     * <hr>
     * <p>
     * <table border="1">
     *<tr>
     * <td>按钮名称</td>
     * <td>事件名称</td>
     * </tr>
     *<tr>
     * <td>确定</td>
     * <td>onOK</td>
     * </tr>
     *<tr>
     * <td>取消</td>
     * <td>onCancel</td>
     * </tr>
     *</table>
     * 
     * @param message 信息
     * @param title 标题
     * @param eventListener 事件监听方法
     */
    public void showQuestion(final String message, final String title,
        final EventListener eventListener) {
        Messagebox.show(message, title, Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION,
		    eventListener);
        
    }
    
}
